package com.zyg.cart.service.impl;

import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON;
import com.zyg.cart.client.ManagerClient;
import com.zyg.cart.entity.ItemEntity;
import com.zyg.cart.entity.TbOrderItem;
import com.zyg.cart.entity.group.Cart;
import com.zyg.cart.service.CartService;
import com.zyg.common.utils.IdWorker;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

@Service
public class CartServiceImpl implements CartService {
    @Autowired
    private StringRedisTemplate redisTemplate;
    @Autowired
    private ManagerClient managerClient;
    @Autowired
    private IdWorker idWorker;
    //添加商品到购物车
    @Override
    public List<Cart> addCart(Long itemId,int num,String name ){
        List<Cart> cartList = null;
        //根据登录名name得到redis中的购物车列表信息
        String cartListStr  = redisTemplate.opsForValue().get(name);
        //判断是否有内容
            if (StrUtil.isNotBlank(cartListStr)){
                cartList = JSON.parseArray(cartListStr, Cart.class);
            }else {
                cartList = new ArrayList<>();
            }

            //根据商品id查到商品
            ItemEntity item = managerClient.findById(itemId+"");
            System.out.println("item = "+item);

            //得到商家id
            String sellerId = item.getSellerId();
            //根据商家id查询出购物车对象
            Cart cart = findCartBySellerId(cartList,sellerId);

            //判断是否能改购物车
            if (cart !=null){       //如果存在就修改商品
                //从购物车列表中找到商品，从而修改
                updateOrderItem(cart,item,num);
            }else {             //如果不存在，就创建订单项商品，添加到购物车中
                TbOrderItem orderItem = createOrderItem(item,num);
                //创建购物车,并将订单项放到新的购物车中
                cart = createCart(orderItem,item);
                //添加购物车到购物车列表
                cartList.add(cart);
            }

        //如果一个购物车中的所有订单项的个数为0，就从购物车列表中删除此购物车
        if(cart.getOrderItemList().size()==0){
             cartList.remove(cart);
        }
        //将购物车添加到redis中
        redisTemplate.opsForValue().set(name,JSON.toJSONString(cartList));

            return cartList;
    }




    //根据商家id查询出购物车
    private Cart findCartBySellerId(List<Cart> cartList,String sellerId) {
        if (cartList.size()>0){
            for (Cart cart : cartList) {
                if (cart.getSellerId().equals(sellerId)){
                    return cart;
                }
            }
        }
        return null;
    }
    //创建订单项商品
    private TbOrderItem createOrderItem(ItemEntity item, int num) {
        //定义订单项id
        long id = idWorker.nextId();
        TbOrderItem orderItem = new TbOrderItem();
        //设置订单项的其他属性
        orderItem.setId(id);
        orderItem.setNum(num);
        orderItem.setTitle(item.getTitle());
        orderItem.setPrice(item.getPrice());
        orderItem.setItemId(item.getId());
        orderItem.setGoodsId(item.getGoodsId());
        orderItem.setSellerId(item.getSellerId());
        orderItem.setPicPath(item.getImage());
        orderItem.setTotalFee(new BigDecimal(item.getNum() * item.getPrice().doubleValue()));
        return orderItem;
    }

    //创建购物车
    private Cart createCart(TbOrderItem orderItem,ItemEntity item) {
        //新建一个购物车
        Cart cart = new Cart();
        //新建一个订单项集合
        List<TbOrderItem> orderItems = new ArrayList<>();
        //将这个订单对象放到集合中
        orderItems.add(orderItem);
        //将这个订单项集合绑定到购物车中
        cart.setOrderItemList(orderItems);
        //设置购物车的其他项
        cart.setSellerId(orderItem.getSellerId());
        //设置商家名字
        cart.setSellerName(item.getSeller());
        return  cart;
    }

    //修改购物车中的商品与数量
    private void updateOrderItem(Cart cart, ItemEntity item, int num) {
        //查找在购物车商品列表是否含有持商品
        TbOrderItem tbOrderItem = null;
        for (TbOrderItem orderItem : cart.getOrderItemList()) {
            if (orderItem.getItemId().longValue()==item.getId()){
                tbOrderItem = orderItem;
                break;
            };
        }
        //根据是否找到购物车商品，决定修改还是添加到购物项
        if (tbOrderItem!=null){
            //修改商品数量
            tbOrderItem.setNum(tbOrderItem.getNum()+num);
            //修改商品金额
            tbOrderItem.setTotalFee(new BigDecimal(tbOrderItem.getNum() * tbOrderItem.getPrice().doubleValue()));
        }else{//没有此商品就创建它
            TbOrderItem orderItem = createOrderItem(item, num);
            //再将此商品放到购物车列表中
            cart.getOrderItemList().add(orderItem);
        }

        //5.5 如果商品数量为0，就从购物车中的商品列表中删除它
        if (tbOrderItem.getNum() == 0){
            cart.getOrderItemList().remove(tbOrderItem);
        }
    }
    //从redis中得到购物车列表
        @Override
        public List<Cart> findCartList(String name) {
            return JSON.parseArray(redisTemplate.opsForValue().get(name),Cart.class);
        }
}
